#因为自定义的函数是和exception_handler模块同名，所以给导入的起个别名
from django.db import DatabaseError
from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import exception_handler as drf_exception_handler

#自定义DRF框架异常处理函数,如果是在setting中配置了，那这个异常处理就是对于全局的
def exception_handler(exc,context):
    #调用DRF框架默认异常处理函数进行处理
    #exc 是出错的异常，context是存储了调用此函数的视图的键值对
    # drf_exception_handler会返回一个response，如果默认的异常捕捉可以处理的，会返回None
    # 如果不能处理，就会把错误原样返回就是传进去的exc
    response = drf_exception_handler(exc, context)

    if response is None:
        #DRF框架不能处理这个异常
        #补充数据库的异常处理
        #取出调用此函数的视图
        view = context['view']
        if isinstance(exc,DatabaseError):
            #打印哪个视图出了什么错误
            print('[%s]:%s'%(view,exc))
            response = Response({'detail':"服务器内部错误"},status=status.HTTP_507_INSUFFICIENT_STORAGE)

    return response
